package day;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 每日一题
 */
public class Solution {

    /**
     * 1920. 基于排列构建数组
     * 利用了题目中所有数字都在 [0, n-1] 范围内的特点。
     * 通过将新值存储在数字的高位（乘以 n），同时保留原始值在低位（取模 n），最后通过除以 n 来获取新值。
     *
     * @param nums
     * @return
     */
    public int[] buildArray(int[] nums) {
        int n = nums.length;
        // 使用高位存储新值，低位保留原值
        for (int i = 0; i < n; i++) {
            nums[i] = nums[i] + n * (nums[nums[i]] % n);
        }
        // 提取高位的新值
        for (int i = 0; i < n; i++) {
            nums[i] = nums[i] / n;
        }
        return nums;
    }

    /**
     * 2094. 找出 3 位偶数
     * @param digits
     * @return
     */
    public int[] findEvenNumbers(int[] digits) {
        List<Integer> list = new ArrayList<>();
        
        int[] count = new int[10];
        for (int num : digits) {
            count[num]++;
        }

        for (int i = 1; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    count[i]--;
                    count[j]--;
                    count[k]--;
                    if (count[i] >= 0 || count[j] >= 0 || count[k] >= 0) {
                        int cur = i * 100 + j * 10 + k;
                        if (cur % 2 == 0) {
                            list.add(cur);
                        }
                    }
                    count[i]--;
                    count[j]--;
                    count[k]--;
                }
            }
        }
        
        int[] result = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            result[i] = list.get(i);
        }
        Arrays.sort(result);
        return result;
    }

}
